package org.bigjava.novelplatform.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.bigjava.novelplatform.common.enums.SigningState;
import org.bigjava.novelplatform.entity.Books;
import org.bigjava.novelplatform.entity.Writer;
import org.bigjava.novelplatform.vo.*;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
* @author YKH
* @description 针对表【books】的数据库操作Mapper
* @createDate 2022-03-20 14:42:21
* @Entity org.bigjava.novelplatform.entity.Books
*/
public interface BooksMapper extends BaseMapper<Books> {

    /**
     * 根据id查询
     * @param bookId
     * @return
     */
    Books selectBookById(@Param("bookId") Integer bookId);

    /**
     * 查询前n名，根据热度,积分
     * @param limit
     * @return
     */
    List<Books> listByVisit(@Param("limit") Integer limit);

    /**
     * 模糊查询
     * @param input
     * @return
     */
    List<Books> listByLike(@Param("input") String input);

    /**
     * 查询前n名，根据积分，热度
     * @param limit
     * @return
     */
    List<Books> listByIntegral(@Param("limit") Integer limit);

    /**
     * 查询前n名，根据订阅量，热度
     * @param limit
     * @return
     */
    List<Books> listBySubscription(@Param("limit") Integer limit);

    /**
     * 新书积分,订阅榜
     * 创建时间在30天以内的
     * @param limit
     * @return
     */
    List<Books> listNewBookByIntegral(@Param("limit") Integer limit);

    /**
     * 分页查询
     * @param booksPage
     * @param queryCondition
     * @return
     */
    Page<SimpleBookVo> selectBookPage(@Param("booksPage") Page<SimpleBookVo> booksPage,
                               @Param("queryCondition") QueryCriteriaPlus queryCondition);

    /**
     * 获取作者书籍数
     * @param writerId
     * @return
     */
    Integer selectWriterBookCount(@Param("writerId") Integer writerId);

    /**
     * 获取作者的前n本作品
     * @param writerId
     * @param limit
     * @return
     */
    List<Books> selectWriterBooks(@Param("writerId") Integer writerId , @Param("limit") Integer limit);

    /**
     * 获取书籍月度积分排行
     * @param bookId
     * @return
     */
    @Deprecated
    Integer selectScoreRanking(@Param("bookId") Integer bookId);

    /**
     * 查询月度积分
     * @param bookId
     * @return
     */
    Integer selectIntegralById(@Param("bookId") Integer bookId);

    /**
     * 当前积分所处的排名,无效
     * @param integrate
     * @return
     */

    Integer selectScoreRankingByIntegrate(@Param("integrate") Integer integrate);

    /**
     * 查询比当前积分排名高一位的积分
     * @param integer
     * @return
     */
    Integer selectPriorByIntegral(@Param("integer") Integer integer);

    /**
     * 查询比当前积分低一位的积分
     * @param integer
     * @return
     */
    Integer selectAfterIntegral(@Param("integer") Integer integer);

    /**
     * 分页查询分类为collect任意一种中的书籍
     * @param collect
     * @return
     */
/*    Page<SimpleBookVo> selectInCatalogName(@Param("booksPage") Page<SimpleBookVo> booksPage ,
                                           @Param("catalogList") List<String> collect, QueryCriteria queryMap);*/

    /**
     * 根据Books的ID查询Book的url
     * */
    String selectBookIDqueryURL(@Param("booksid") Integer booksid);

    /**
     * 根据book中作者的id查询指定书名的数据条数
     */
    Integer selectBookNameAmount(@Param("writerid") Integer writerid, @Param("bookname") String bookname);

    /**
     * 更新指定id书籍的最新章节信息
     * */
    Integer updateBookLastChapter(@Param("BookID") Integer BookID, @Param("LastChapterName") String LastChapterName, @Param("LastChapterId") Long LastChapterId, @Param("date") Date date);

    /**逻辑删除指定id的书*/
    Integer updateBookDeleteState(@Param("bookid") Integer bookid);

    /**下架指定id的额书*/
    Integer updateBookSaleState(@Param("bookid") Integer bookid);

    /**查询这个作者发布的所有书籍的id,name,url（不包括以已删除的*/
    List<Books> selectNotDeletedBookNameURL(@Param("writer") Writer writer, @Param("state") Integer state);

    /**查询这个作者发布的所有已删除书籍的id,name,url*/
    List<Books> selectDeletedBookNameURL(@Param("writer") Writer writer);

    /**查询指定id书籍(未删除的)是否存在*/
    Integer selectAllByQuantity(@Param("bookid") Integer bookid);

    /**查询指定id书籍的最新章节id*/
    Long selectAllByIdChapter(@Param("booksId") Integer booksId);

    /*获取指定id书籍中已删除的章节名字*/
    List<String> selectChapterDeletedByBookId(@Param("bookId") Integer bookId);

    /**
     * 查询作者的书籍，根据作者的用户id
     * @param userId
     * @return
     */
    List<Books> selectByUserId(@Param("userId") Integer userId);

    /**
     * 书籍收藏书+1
     * @param bookId
     */
    void addSubscription(@Param("bookId") Integer bookId);

    /**
     * 书籍收藏书+1 批量
     * @param bookIdList
     */
    void addSubscriptionBatch(@Param("bookIdList") List<Integer> bookIdList);

    /**搜索书籍*/
    List<BookVoList> selectAllByBookVoList(@Param("bookName") String bookName);

    /**
     * 更新数据
     * @param books
     */
    void updateSimpleById(@Param("books") Books books);

    /**
     * 根据id查询书籍，无限制
     * @param bookId
     * @return
     */
    WriterBookVo selectBookByIdUnlimited(@Param("bookId") Integer bookId);

    /**
     * 排序分页
     * @param booksPage
     * @param catalogs 书籍分类
     * @param orderType 排序字段
     */
    @Deprecated
    Page<Books> selectOrder(Page<Books> booksPage, List<String> catalogs, String orderType);

    /**
     * 阅读指数排序分页限定书籍上架时间
     * @param booksPage
     * @param catalogs
     * @param newBookTime
     * @return
     */
    @Deprecated
    Page<Books> selectOrderRestrictSaleTime(@Param("booksPage") Page<Books> booksPage, @Param("catalogs") List<String> catalogs, @Param("newBookTime") String newBookTime);

    /**
     * 阅读指数排序分页,限定书籍上架时间,是否签约作者
     * @param booksPage
     * @param catalogs
     * @param bookSaleTime
     * @param writerTime
     * @param signingState
     * @return
     */
    @Deprecated
    Page<Books> selectNewBookOrder(@Param("booksPage") Page<Books> booksPage, @Param("catalogs") List<String> catalogs, @Param("bookSaleTime") String bookSaleTime,
                                             @Param("writerTime") String writerTime, @Param("signingState") SigningState signingState);

    /**
     *
     * @param catalogs 分类
     * @param newBookTime 新书
     * @param newWriterTime 新人
     * @param signing   签约
     * @param orderType 排序字段
     * @param limitNum 数量
     * @return
     */
    List<BookOrderVo> selectBookList(@Param("catalogs") List<String> catalogs, @Param("newBookTime") String newBookTime,
                                     @Param("newWriterTime") String newWriterTime, @Param("signing") SigningState signing,
                                     @Param("orderType") String orderType,
                                     @Param("orderField") String orderField, @Param("limitNum") Integer limitNum);

    /**
     * 排行分页
     * @param page
     * @param catalogs
     * @param newBookTime
     * @param newWriterTime
     * @param signing
     * @param orderType
     * @param orderField
     * @return
     */
    Page<BookOrderPageVo> selectBookListPage(@Param("page") Page<BookOrderPageVo> page , @Param("catalogs") List<String> catalogs,
                                             @Param("newBookTime") String newBookTime,
                                             @Param("newWriterTime") String newWriterTime, @Param("signing") SigningState signing,
                                             @Param("orderType") String orderType,
                                             @Param("orderField") String orderField);


    /**
     * 完结
     * @param bookId
     * @param writerId
     */
    void theBookIsOver(@Param("bookId") Integer bookId, Integer writerId);

    /**
     * 增加章节收益
     * @param profit
     * @param bookId
     */
    void increaseRevenue(@Param("profit") BigDecimal profit, @Param("bookId") Integer bookId);

    /**
     * 查询免费章节
     * @param bookId
     * @return
     */
    Integer selectFreeChapter(@Param("bookId") Integer bookId);

    /**
     * 增加打赏收益
     * @param profit
     * @param bookId
     * @param integral 积分
     */
    void increaseEarningsOther(@Param("profit") BigDecimal profit, @Param("bookId") Integer bookId,
                               @Param("integral") Long integral);

}




